﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using DataEntity;
using FastLibrary.Criptografia;

namespace Contract.Data.Manager
{
    //Criado por : Gustavo
    //Data       : 10/25/2011 12:14:01 AM
    public class DMFuncionario : DMGeneric<BEFuncionario, FEFuncionario>
    {
        databaseDataContext dc;

        #region Override

        public override BEFuncionario Salvar(BEFuncionario entidade)
        {
            try
            {
                if (entidade.Codigo.Equals(0))
                    entidade.Codigo = Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BEFuncionario entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from r in dc.DEFuncionarios
                            where
                                r.Codigo == entidade.Codigo
                            select r;

                    DEFuncionario de = q.First();

                    dc.DEFuncionarios.DeleteOnSubmit(de);

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BEFuncionario ObterEntidade(int codigo)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEFuncionarios
                            where
                                e.Codigo == codigo
                            select e;

                    return q.First().ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BEFuncionario> ObterTodos(FEFuncionario filter)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEFuncionarios
                            where
                            (
                                (((filter.Nome != null)
                                && (e.Nome.Contains(filter.Nome))) || (filter.Nome == null)) &&

                                (((filter.Telefone != null)
                                && (e.Telefone.Contains(filter.Telefone))) || (filter.Telefone == null)) &&

                                (((filter.Celular != null)
                                && (e.Celular.Contains(filter.Celular))) || (filter.Celular == null)) &&

                                (((filter.Administrador != null)
                                && (e.Administrador == filter.Administrador)) || (filter.Administrador == null)) &&

                                (((filter.Bloqueado != null)
                                && (e.Bloqueado == filter.Bloqueado)) || (filter.Bloqueado == null)) &&

                                (((filter.CodigoFuncao != null)
                                && (e.CodigoFuncao == filter.CodigoFuncao)) || (filter.CodigoFuncao == null))
                            )
                            select e;

                    List<DEFuncionario> deFuncionario = q.ToList();

                    List<BEFuncionario> retorno = new List<BEFuncionario>();

                    foreach (DEFuncionario de in deFuncionario)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        public bool Logar(string usuario, string senha)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEFuncionarios
                            where
                             e.Senha.Equals(Cript.getMD5Hash(senha)) &&
                             e.Login.Equals(usuario) &&
                             !e.Bloqueado
                            select e;

                    DEFuncionario funcionario = q.FirstOrDefault();

                    return funcionario != null;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void AlterarSenha(string usuario, string senhaAntiga, string senhaNova)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEFuncionarios
                            where
                             e.Senha.Equals(Cript.getMD5Hash(senhaAntiga)) &&
                             e.Login.Equals(usuario) &&
                             !e.Bloqueado
                            select e;

                    DEFuncionario funcionario = q.FirstOrDefault();

                    if (funcionario == null)
                        throw new Exception("Usuário ou senha inválidos.");
                    else
                    {
                        funcionario.Senha = Cript.getMD5Hash(senhaNova);

                        dc.SubmitChanges();
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private int Incluir(BEFuncionario entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    DEFuncionario de = new DEFuncionario();
                    de.ConvertFromBE(entidade);

                    dc.DEFuncionarios.InsertOnSubmit(de);

                    dc.SubmitChanges();

                    return de.Codigo;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BEFuncionario entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEFuncionarios
                            where e.Codigo == entidade.Codigo
                            select e;

                    DEFuncionario de = q.First();

                    de.Nome = entidade.Nome;
                    de.Bairro = entidade.Bairro;
                    de.Cidade = entidade.Cidade;
                    de.CEP = entidade.CEP.Replace("-", "");
                    de.UF = entidade.UF;
                    de.Telefone = entidade.Telefone.Replace("-", "");
                    de.Celular = entidade.Celular.Replace("-", "");
                    de.Administrador = entidade.Administrador;
                    de.CodigoFuncao = entidade.CodigoFuncao;
                    de.Login = entidade.Login;
                    de.Senha = entidade.Senha;
                    de.Bloqueado = entidade.Bloqueado;

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
